home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Examples / SpriteTest / Application.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-06  |  12.5 KB  |  621 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    Application.c
  3. //
  4. // By: Tony Myles
  5. //
  6. // Extensive modifications by Karl Bunker
  7. //
  8. ///--------------------------------------------------------------------------------------
  9. #ifndef __TOOLUTILS__
  10. #include <ToolUtils.h>
  11. #endif
  12.  
  13. #ifndef __DEVICES__
  14. #include <Devices.h>
  15. #endif
  16.  
  17. #ifndef __GESTALTEQU__
  18. #include <Gestalt.h>
  19. #endif
  20.  
  21. #ifndef __PALETTES__
  22. #include <Palettes.h>
  23. #endif
  24.  
  25.  
  26. #include <SWIncludes.h>            // Automatically include all SpriteWorld.h files
  27. #include <SWGameUtils.h>
  28. #include <SWDialogUtils.h>
  29. #include <SWApplication.h>    
  30.  
  31. #if __MWERKS__
  32. #include <profiler.h>
  33. #endif
  34.  
  35. #include "Application.h"
  36. #include "SpriteTest.h"
  37. #include "About.h"
  38.  
  39. #define kWindowInsetH 0     // modify to test windows smaller than 640x480 screen size
  40. #define kWindowInsetV 0
  41.  
  42. SpriteTestPtr             gSpriteTestP = NULL;
  43. WindowPtr                 gWindowP = NULL;
  44.  
  45. static Boolean             gDone = false;
  46. static Boolean             gInBackGround = false;
  47.  
  48. extern Boolean            gGlobesVisible;
  49. extern Boolean            gTitleVisible;
  50. extern Boolean            gCollisionDetection;
  51.  
  52. extern long                gLastTestFrames;
  53. extern float            gLastTestSeconds;
  54.  
  55.  
  56. /******************** main ********************/
  57. void main(void)
  58. {
  59. /*
  60.     ProfilerInit( collectDetailed, bestTimeBase, 100, 40 );
  61.     ProfilerSetStatus( false );
  62. */
  63.     Initialize(2);
  64.  
  65.     CreateMenuBar();
  66.     CreateWindow();
  67.  
  68.     EnterApplication();
  69.     ServiceEvents();
  70.     
  71.     ExitApplication();
  72.     ExitToShell();
  73. }
  74.  
  75.  
  76. /******************** CreateMenuBar ********************/
  77. void CreateMenuBar(void)
  78. {
  79.     Handle menuBarH;
  80.  
  81.     menuBarH = GetNewMBar(kMenuBarResID);
  82.  
  83.     if (menuBarH != NULL)
  84.     {
  85.         SetMenuBar(menuBarH);
  86.         AppendResMenu(GetMenuHandle(kAppleMenuID), 'DRVR');
  87.         DrawMenuBar();
  88.     }
  89.     else
  90.     {
  91.         CantFindResource();
  92.     }
  93. }
  94.  
  95.  
  96. /******************** CreateWindow ********************/
  97. void CreateWindow(void)
  98. {
  99.     Rect        monitorRect;
  100.     short        windowInsetH = kWindowInsetH;
  101.     short        windowInsetV = kWindowInsetV;
  102.     
  103.     
  104.     gWindowP = GetNewCWindow(kMyWindowResID, NULL, (WindowPtr)-1L);
  105.     
  106.     if (gWindowP != NULL)
  107.     {
  108.         monitorRect = (*GetMainDevice())->gdRect;
  109.         
  110.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left), 
  111.                     (monitorRect.bottom-monitorRect.top), false);
  112.                     
  113.         if ( (monitorRect.right-monitorRect.left) > 640 )
  114.             windowInsetH += ((monitorRect.right-monitorRect.left) - 640)/2;
  115.         if ( (monitorRect.bottom-monitorRect.top) > 480 )
  116.             windowInsetV += ((monitorRect.bottom-monitorRect.top) - 480)/2;
  117.         
  118.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left) - (windowInsetH*2), 
  119.                     (monitorRect.bottom-monitorRect.top) - (windowInsetV*2), false);
  120.         
  121.         MoveWindow(gWindowP, monitorRect.left + windowInsetH, 
  122.             monitorRect.top + windowInsetV, false);
  123.     }
  124.     else
  125.     {
  126.         CantFindResource();
  127.     }
  128. }
  129.  
  130.  
  131. /******************** EnterApplication ********************/
  132. void EnterApplication(void)
  133. {
  134.     OSErr    err = noErr;
  135.     
  136.         
  137.     err = SWEnterSpriteWorld();
  138.     FatalError(err);
  139.  
  140.     err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  141.     FatalError(err);
  142.  
  143.     ShowWindow(gWindowP);
  144.     UpdateSpriteTest(gSpriteTestP, gWindowP);
  145.     ValidRect(&gWindowP->portRect);
  146. }
  147.  
  148.  
  149. /******************** ExitApplication ********************/
  150. void ExitApplication(void)
  151. {
  152.     
  153.     DisposeSWStuff(gSpriteTestP);
  154.     SWExitSpriteWorld();
  155.     
  156.     DisposeWindow(gWindowP);
  157. }
  158.  
  159. #pragma mark -
  160.  
  161. /******************** ServiceEvents ********************/
  162. void ServiceEvents(void)
  163. {
  164.     Boolean haveEvent;
  165.     EventRecord event;
  166.     long sleepTime;
  167.  
  168.     while (!gDone)
  169.     {
  170.         sleepTime = gInBackGround ? kBackGroundSleepTime : kForeGroundSleepTime;
  171.         haveEvent = WaitNextEvent(everyEvent, &event, sleepTime, NULL);
  172.  
  173.         if (haveEvent)
  174.         {
  175.             DispatchEvent(&event);
  176.         }
  177.         else
  178.         {
  179.             HandleNullEvent();
  180.         }
  181.     }
  182. }
  183.  
  184.  
  185. /******************** DispatchEvent ********************/
  186. void DispatchEvent(
  187.     EventRecord* event)
  188. {
  189.     switch(event->what)
  190.     {
  191.         case mouseDown:
  192.             HandleMouseEvent(event);
  193.             break;
  194.         case mouseUp:
  195.             break;
  196.         case keyUp:
  197.             break;
  198.         case keyDown:
  199.         case autoKey:
  200.             HandleKeyEvent((char)(event->message & charCodeMask), event->modifiers);
  201.             break;
  202.         case updateEvt:
  203.             HandleUpdateEvent((WindowPtr)event->message);
  204.             break;
  205.         case diskEvt:
  206.             break;
  207.         case activateEvt:
  208.             break;
  209.         case osEvt:
  210.             HandleOSEvent(event->message);
  211.             break;
  212.         case kHighLevelEvent:
  213.             break;
  214.         default:
  215.         break;
  216.     }
  217. }
  218.  
  219.  
  220. /******************** HandleMouseEvent ********************/
  221. void HandleMouseEvent(
  222.     EventRecord* event)
  223. {
  224.     WindowPtr whichWindow;
  225.     short partCode;
  226.  
  227.     partCode = FindWindow(event->where, &whichWindow);
  228.  
  229.     switch (partCode)
  230.     {
  231.         case inDesk:        
  232.             break;
  233.         case inMenuBar:
  234.             AdjustMenuItems();
  235.             HandleMenuCommand(MenuSelect(event->where));
  236.             break;
  237.         case inSysWindow:
  238.             SystemClick(event, whichWindow);
  239.             break;
  240.         case inContent:
  241.             RemoveClickedSprite( gSpriteTestP );
  242.             break;
  243.         case inDrag:
  244.             break;
  245.         case inGrow:
  246.             break;
  247.         case inGoAway:
  248.             break;
  249.         case inZoomIn:
  250.         case inZoomOut:
  251.             break;
  252.         default:            
  253.             break;
  254.     }
  255. }
  256.  
  257.  
  258. /******************** HandleKeyEvent ********************/
  259. void HandleKeyEvent(
  260.     char key,
  261.     short modifiers)
  262. {
  263.     
  264.     if ((modifiers & cmdKey) != 0)
  265.     {
  266.         AdjustMenuItems();
  267.         HandleMenuCommand(MenuKey(key));
  268.     }
  269.     else
  270.     {
  271.             // if the spacebar is hit, fill the screen with black
  272.             // useful for debugging purposes
  273.         if (key == ' ')
  274.         {
  275.             FillRect(&gSpriteTestP->spriteWorldP->windowFrameP->frameRect, &qd.black);
  276.         }
  277.     }
  278. }
  279.  
  280.  
  281. /******************** HandleUpdateEvent ********************/
  282. void HandleUpdateEvent(
  283.     WindowPtr updateWindowP)
  284. {
  285.     GDHandle        windowGDH;
  286.     OSErr            err; 
  287.     
  288.     if (updateWindowP == gWindowP)
  289.     {
  290.         SetPort(updateWindowP);
  291.         windowGDH = GetMaxDevice( &updateWindowP->portRect );
  292.         
  293.             // has the depth been changed?
  294.         if ( GetGDeviceDepth(windowGDH) != gSpriteTestP->spriteWorldP->pixelDepth )    
  295.         {    // if so, rebuild SpriteWorld
  296.             DisposeSWStuff(gSpriteTestP);
  297.             err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  298.             FatalError(err);
  299.         }
  300.         BeginUpdate(updateWindowP);
  301.  
  302.         UpdateSpriteTest(gSpriteTestP, updateWindowP);
  303.  
  304.         EndUpdate(updateWindowP);
  305.     }
  306. }
  307.  
  308.  
  309. /******************** HandleOSEvent ********************/
  310. void HandleOSEvent(
  311.     long message)
  312. {
  313.     if ((message >> 24) == suspendResumeMessage)
  314.     {
  315.         if ((message & resumeFlag) != 0)
  316.         {
  317.             gInBackGround = false;
  318.         }
  319.         else
  320.         {
  321.             gInBackGround = true;
  322.         }
  323.     }
  324. }
  325.  
  326.  
  327. /******************** HandleNullEvent ********************/
  328. void HandleNullEvent(void)
  329. {
  330.     SpriteTestIdle(gSpriteTestP);
  331. }
  332.  
  333. #pragma mark -
  334.  
  335. /******************** HandleMenuCommand ********************/
  336. void HandleMenuCommand(
  337.     long menuItemIdentifier)
  338. {
  339.     short menuIdent = HiWord(menuItemIdentifier);
  340.     short menuItem = LoWord(menuItemIdentifier);
  341.  
  342.     switch (menuIdent)
  343.     {
  344.         case kAppleMenuID:
  345.             HandleAppleMenuCommand(menuItem);
  346.             break;
  347.  
  348.         case kFileMenuID:
  349.             HandleFileMenuCommand(menuItem);
  350.             break;
  351.  
  352.         case kEditMenuID:
  353.             HandleEditMenuCommand(menuItem);
  354.             break;
  355.  
  356.         case kSpriteMenuID:
  357.             HandleSpriteMenuCommand(menuItem);
  358.             break;
  359.  
  360.         case kTestMenuID:
  361.             HandleTestMenuCommand(menuItem);
  362.             break;
  363.     }
  364.     HiliteMenu(0);
  365. }
  366.  
  367.  
  368. /******************** HandleAppleMenuCommand ********************/
  369. void HandleAppleMenuCommand(
  370.     short menuItem)
  371. {
  372.     Str255 deskAccName;
  373.  
  374.     switch (menuItem)
  375.     {
  376.         case kAboutItem:
  377.             DisplayAboutBox();
  378.             break;
  379.  
  380.         default:
  381.             GetMenuItemText(GetMenuHandle(kAppleMenuID), menuItem, deskAccName);
  382.             OpenDeskAcc(deskAccName);
  383.             break;
  384.     }
  385. }
  386.  
  387.  
  388. /******************** HandleFileMenuCommand ********************/
  389. void HandleFileMenuCommand(
  390.     short menuItem)
  391. {
  392.     switch (menuItem)
  393.     {
  394.         case kQuitItem:
  395.             gDone = true;
  396.             break;
  397.     }
  398. }
  399.  
  400. /******************** HandleEditMenuCommand ********************/
  401. void HandleEditMenuCommand(
  402.     short menuItem)
  403. {
  404.     (void)SystemEdit(menuItem);
  405. }
  406.  
  407.  
  408. /******************** HandleSpriteMenuCommand ********************/
  409. void HandleSpriteMenuCommand(
  410.     short menuItem)
  411. {
  412.     switch (menuItem)
  413.     {
  414.         case kCreateSpriteItem:
  415.             HandleCreateSpriteCommand(gSpriteTestP);
  416.             break;
  417.  
  418.         case kHideTitleItem:
  419.             HandleSpriteTestTitleCommand(gSpriteTestP);
  420.             break;
  421.  
  422.         case kHideBallsItem:
  423.             HandleBouncingBallsCommand(gSpriteTestP);
  424.             break;
  425.     }
  426. }
  427.  
  428.  
  429. /******************** HandleTestMenuCommand ********************/
  430. void HandleTestMenuCommand(
  431.     short menuItem)
  432. {
  433.     switch (menuItem)
  434.     {
  435.         case kRunTestItem:
  436.             SetPort(gWindowP);
  437.             RunTheTest( gSpriteTestP );
  438.             DisplayPerformance(gLastTestFrames, gLastTestSeconds);
  439.         break;
  440.         
  441.         case kSetUpTestItem:
  442.             SetUpTestDialog( gSpriteTestP );
  443.         break;
  444.         
  445.         case kMonitorDepthItem:
  446.             MonitorDepthDialog();
  447.         break;
  448.         
  449.         case kRunAllTestsItem:
  450.             RunAllTests( gSpriteTestP );
  451.         break;
  452.         
  453.         case kCollisionDetectionItem:
  454.             CollisionProcDialog( gSpriteTestP );
  455.         break;
  456.     }
  457. }
  458.  
  459. #pragma mark -
  460.  
  461. /******************** AdjustMenuItems ********************/
  462. void AdjustMenuItems(void)
  463. {
  464.     MenuHandle tempMenuH;
  465.  
  466.         // adjust the sprite menu
  467.     tempMenuH = GetMenuHandle(kSpriteMenuID);
  468.  
  469.     CheckItem(tempMenuH, kHideTitleItem, gTitleVisible);
  470.     CheckItem(tempMenuH, kHideBallsItem, gGlobesVisible);
  471.  
  472.         // adjust the test menu
  473.     tempMenuH = GetMenuHandle(kTestMenuID);
  474.         
  475. }
  476.  
  477.  
  478. /******************** MonitorDepthDialog ********************/
  479. void MonitorDepthDialog(void)
  480. {
  481.     GrafPtr            savePort;
  482.     DialogPtr        theDialog;
  483.     short            itemHit;
  484.     GDHandle        windowGDH;
  485.     short            originalDepth, requestedDepth;
  486.     Boolean            done = false;
  487.     OSErr            err = noErr;
  488.     
  489.     
  490.     GetPort( &savePort );
  491.         
  492.     theDialog = GetNewDialog(kMonitorDepthResID, nil, (WindowPtr)-1L);
  493.         
  494.     SetDialogDefaultItem( theDialog, ok );
  495.     SetDialogCancelItem( theDialog, cancel );
  496.     
  497.     windowGDH = GetMaxDevice( &theDialog->portRect );
  498.     
  499.     originalDepth = requestedDepth = GetGDeviceDepth(windowGDH);
  500.             
  501.         // Check if monitor can display these depths
  502.     SetDItemHilite( theDialog, k1BitDepthButton, HasDepth(windowGDH, 1, 0, 0) );
  503.     SetDItemHilite( theDialog, k4BitDepthButton, HasDepth(windowGDH, 4, 0, 0) );
  504.     SetDItemHilite( theDialog, k8BitDepthButton, HasDepth(windowGDH, 8, 0, 0) );
  505.     SetDItemHilite( theDialog, k16BitDepthButton, HasDepth(windowGDH, 16, 0, 0) );
  506.     SetDItemHilite( theDialog, k32BitDepthButton, HasDepth(windowGDH, 32, 0, 0) );
  507.     
  508.     SetMonitorDepthButtons( theDialog, originalDepth );
  509.     
  510.     ShowWindow( theDialog );
  511.     
  512.     while ( !done )
  513.     {    
  514.         ModalDialog( nil, &itemHit );
  515.         switch( itemHit )
  516.         {
  517.             case k1BitDepthButton:
  518.                 requestedDepth = 1;
  519.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  520.             break;
  521.             case k4BitDepthButton:
  522.                 requestedDepth = 4;
  523.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  524.             break;
  525.             case k8BitDepthButton:
  526.                 requestedDepth = 8;
  527.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  528.             break;
  529.             case k16BitDepthButton:
  530.                 requestedDepth = 16;
  531.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  532.             break;
  533.             case k32BitDepthButton:
  534.                 requestedDepth = 32;
  535.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  536.             break;
  537.             case ok:
  538.             case cancel:
  539.                 done = true;
  540.             break;
  541.         }
  542.     }
  543.     DisposeDialog( theDialog );
  544.     SetPort( savePort );
  545.     
  546.     if ( itemHit == ok )
  547.     {
  548.         err = SetNewMonitorDepth(requestedDepth);
  549.         FatalError(err);
  550.     }
  551. }
  552.  
  553.  
  554. /******************** SetNewMonitorDepth ********************/
  555. OSErr SetNewMonitorDepth( short newDepth )
  556. {
  557.     OSErr            err = noErr;
  558.     GDHandle        windowGDH;
  559.     Rect            globalRect;
  560.     
  561.     globalRect = gWindowP->portRect;
  562.     SetPort(gWindowP);
  563.     LocalToGlobal( &topLeft(globalRect) );
  564.     LocalToGlobal( &botRight(globalRect) );
  565.     windowGDH = GetMaxDevice( &globalRect );
  566.     
  567.     if ( (**(**windowGDH).gdPMap).pixelSize != newDepth )
  568.     {
  569.             // can we do colors?
  570.         if ( HasDepth(windowGDH, newDepth, 1, 1) )
  571.         {
  572.             err = SetDepth( windowGDH, newDepth, 1, 1 );
  573.         }
  574.             // if not, settle for greyscale
  575.         else
  576.         {
  577.             err = SetDepth( windowGDH, newDepth, 1, 0 );
  578.         }
  579.  
  580.         if ( err == noErr )
  581.         {
  582.             DisposeSWStuff(gSpriteTestP);
  583.         
  584.             err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  585.             FatalError(err);
  586.             
  587.             if( err == noErr)
  588.             {
  589.                 extern SpritePtr    gMasterGlobeSprite;
  590.                 
  591.                 SWUnlockSpriteWorld(gSpriteTestP->spriteWorldP);
  592.                 SWUnlockSprite( gMasterGlobeSprite );
  593.                 
  594.                     // compact memory, clean up the heap.
  595.                     // not absolute necessary, but nice... (helps fragmentation)
  596.                 CompactMem(MaxBlock());
  597.             
  598.                 SWLockSpriteWorld(gSpriteTestP->spriteWorldP);
  599.                 SWLockSprite( gMasterGlobeSprite );
  600.                 
  601.             }
  602.         }
  603.     }
  604.     
  605.     return err;
  606. }
  607.  
  608.  
  609. /******************** SetMonitorDepthButtons ********************/
  610. void SetMonitorDepthButtons(
  611.     DialogPtr theDialog,
  612.     short theDepth)
  613. {
  614.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k1BitDepthButton), (theDepth == 1) );
  615.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k4BitDepthButton), (theDepth == 4) );
  616.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k8BitDepthButton), (theDepth == 8) );
  617.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k16BitDepthButton), (theDepth == 16) );
  618.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k32BitDepthButton), (theDepth == 32) );
  619. }
  620.  
  621.